포인터 연산과 인수 전달
✒️ 2025-04-03 13:15 내용 수정
수제비 2024 정보처리기사 필기 5판 1권의 내용을 정리
TCPSchool의 내용을 정리
포인터 연산
- 포인터는 제한된 연산만 가능하다
- 포인터끼리의 덧셈, 곱셈, 나눗셈은 의미가 없다.
- 포인터끼리의 뺄셈은 두 포인터 사이의 상대적 거리를 나타낸다.
- 포인터에 정수를 더하거나 뺄 수 있으나, 실수와의 연산은 허용되지 않는다.
- 포인터에 정수 1을 더했을 때 주소값이 바뀌는 것을 확인할 수 있는데, 타입별 크기 만큼 주소값이 증가한다.
char: 1 byteint: 4 bytedouble: 8 byte
#include <stdio.h>
int main(void)
{
char* p_c = 0;
int* p_i = NULL;
double* p_d = 0x00;
// 부호 없는 16진 정수로 표기
// # : 토큰을 문자열로 변환
printf("p_c 주소값 : %#x\n", p_c);
printf("p_i 주소값 : %#x\n", p_i);
printf("p_d 주소값 : %#x\n", p_d);
printf("p_c + 1 주소값 : %#x\n", ++p_c);
printf("p_i + 1 주소값 : %#x\n", ++p_i);
printf("p_d + 1 주소값 : %#x\n", ++p_d);
return 0;
}
p_c 주소값 : 0
p_i 주소값 : 0
p_d 주소값 : 0
p_c + 1 주소값 : 0x1
p_i + 1 주소값 : 0x4
p_d + 1 주소값 : 0x8
- 포인터끼리 대입하거나 비교할 수 있다.
#include <stdio.h>
int main(void)
{
int num1 = 10;
int num2 = 20;
int* p_num1 = &num1;
int* p_num2 = &num2;
// 부호 없는 16진 정수로 표기
// # : 토큰을 문자열로 변환
printf("p_num1의 주소값 : %#x\n", p_num1);
printf("p_num2의 주소값 : %#x\n", p_num2);
printf("p_num1 == p_num2 결과 : %d\n\n", p_num1 == p_num2);
// p_num1 포인터에 p_num2가 가리키는 주소값 대입
p_num1 = p_num2;
printf("p_num1의 주소값 : %#x\n", p_num1);
printf("p_num2의 주소값 : %#x\n", p_num2);
printf("대입 연산 후 p_num1 == p_num2 결과 : %d", p_num1 == p_num2);
return 0;
}
p_num1의 주소값 : 0x5ffe74
p_num2의 주소값 : 0x5ffe70
p_num1 == p_num2 결과 : 0
p_num1의 주소값 : 0x5ffe70
p_num2의 주소값 : 0x5ffe70
대입 연산 후 p_num1 == p_num2 결과 : 1
인수 전달
- 함수에 필요한 데이터인 인수(argument)를 전달하는 방법은 값에 의한 전달과 참조에 의한 전달이 있다.
1. 값에 의한 전달
- 인수로 전달되는 변수가 가진 값을 함수 내의 매개변수에 복사하는 방법이다.
- 복사된 값으로 초기화된 매개변수는 인수로 전달된 변수와는 별개의 변수가 된다.
- 함수 내에서의 매개변수 조작은 인수로 전달되는 변수에 영향을 미치지 않는다.
#include <stdio.h>
void local(int num)
{
num += 10;
}
int main(void)
{
int var = 20;
printf("var의 초기값 : %d\n", var);
local(var);
printf("함수 호출 후 var 값 : %d\n", var);
return 0;
}
var의 값은local()에 의해 변하지 않았다.
var의 초기값 : 20
함수 호출 후 var 값 : 20
2. 참조에 의한 전달
- 함수의 매개변수에 인수로 전달된 변수의 원래 주소값을 저장한다.
- 인수로 전달된 변수의 값을 함수 내에서 변경할 수 있다.
#include <stdio.h>
void local(int num)
{
num += 10;
}
void pLocal(int* num)
{
*num += 10;
}
int main(void)
{
int var = 20;
printf("var의 초기값 : %d\n", var);
local(var);
printf("local 함수 호출 후 var 값 : %d\n", var);
pLocal(&var);
printf("pLocal 함수 호출 후 var 값 : %d\n", var);
return 0;
}
pLocal()함수 호출 후에는 주소값을 저장한 후 함수 내에서 동작을 수행했기에var값이 바뀌었다.
var의 초기값 : 20
local 함수 호출 후 var 값 : 20
pLocal 함수 호출 후 var 값 : 30